//Copyright (c) 2006-2007 Microsoft Corporation.  All rights reserved
using System;
using System.Diagnostics;
using System.Globalization;

namespace InvocationFramework.Common.Instrumentation
{
    /// <summary>
    /// Helper para escribir informacion de trazabilidad
    /// </summary>
    /// <author>Rodolfo Finochietti 14/11/2005 14.01</author>
    internal static class TraceHelper
    {
        #region Private Vars

        /// <summary>
        /// Source utilizado para escribir las entradas de trace
        /// </summary>
        private static readonly TraceSource _source = new TraceSource( "InvocationFramework" );

        #endregion

        #region Public Methods

        /// <summary>
        /// Escribe una entrada de tipo 'Information'
        /// </summary>
        /// <param name="message">Mensaje</param>
        public static void Information( string message )
        {
            WriteTrace( TraceEventType.Information, message, null );
        }
        
        /// <summary>
        /// Escribe una entrada de tipo 'Information'
        /// </summary>
        /// <param name="message">Mensaje</param>
        /// <param name="args">Argumentos del evento</param>
        public static void Information( string message, params object[] args )
        {
            WriteTrace( TraceEventType.Information, message, args );
        }

        /// <summary>
        /// Escribe una entrada de tipo 'Warning'
        /// </summary>
        /// <param name="message">Mensaje</param>
        public static void Warning( string message )
        {
            WriteTrace( TraceEventType.Warning, message, null );
        }

        /// <summary>
        /// Escribe una entrada de tipo 'Warning'
        /// </summary>
        /// <param name="message">Mensaje</param>
        /// <param name="args">Argumentos del evento</param>
        public static void Warning( string message, params object[] args )
        {
            WriteTrace( TraceEventType.Warning, message, args );
        }

        /// <summary>
        /// Escribe una entrada de tipo 'Error'
        /// </summary>
        /// <param name="ex">Excepcion</param>
        /// <param name="message">Mensaje</param>
        /// <param name="args">Argumentos del evento</param>
        public static void Warning( Exception ex, string message, params object[] args )
        {
            WriteTrace( TraceEventType.Warning, ex, message, args );
        }
        
        /// <summary>
        /// Escribe una entrada de tipo 'Verbose'
        /// </summary>
        /// <param name="message">Mensaje</param>
        public static void Verbose( string message )
        {
            WriteTrace( TraceEventType.Verbose, message, null );
        }

        /// <summary>
        /// Escribe una entrada de tipo 'Verbose'
        /// </summary>
        /// <param name="message">Mensaje</param>
        /// <param name="args">Argumentos del evento</param>
        public static void Verbose( string message, params object[] args )
        {
            WriteTrace( TraceEventType.Verbose, message, args );
        }

        /// <summary>
        /// Escribe una entrada de tipo 'Error'
        /// </summary>
        /// <param name="message">Mensaje</param>
        public static void Error( string message )
        {
            WriteTrace( TraceEventType.Error, message, null );
        }

        /// <summary>
        /// Escribe una entrada de tipo 'Error'
        /// </summary>
        /// <param name="message">Mensaje</param>
        /// <param name="args">Argumentos del evento</param>
        public static void Error( string message, params object[] args )
        {
            WriteTrace( TraceEventType.Error, message, args );
        }

        /// <summary>
        /// Escribe una entrada de tipo 'Error'
        /// </summary>
        /// <param name="ex">Excepcion</param>
        /// <param name="message">Mensaje</param>
        /// <param name="args">Argumentos del evento</param>
        public static void Error( Exception ex, string message, params object[] args )
        {
            WriteTrace( TraceEventType.Error, ex, message, args );
        }

        /// <summary>
        /// Escribe una entrada de tipo 'Critical'
        /// </summary>
        /// <param name="message">Mensaje</param>
        public static void Critical( string message )
        {
            WriteTrace( TraceEventType.Critical, message, null );
        }
        
        /// <summary>
        /// Escribe una entrada de tipo 'Critical'
        /// </summary>
        /// <param name="message">Mensaje</param>
        /// <param name="args">Argumentos del evento</param>
        public static void Critical( string message, params object[] args )
        {
            WriteTrace( TraceEventType.Critical, message, args );
        }

        /// <summary>
        /// Escribe una entrada de tipo 'Critical'
        /// </summary>
        /// <param name="ex">Excepcion</param>
        /// <param name="message">Mensaje</param>
        /// <param name="args">Argumentos del evento</param>
        public static void Critical( Exception ex, string message, params object[] args )
        {
            WriteTrace( TraceEventType.Critical, ex, message, args );
        }

        #endregion

        #region Private Methods

        /// <summary>
        /// Escribe una entrada de trace
        /// </summary>
        /// <param name="eventType">Tipo de evento</param>
        /// <param name="message">mensaje</param>
        /// <param name="args">Argumentos del evento</param>
        private static void WriteTrace( TraceEventType eventType, string message, params object[] args )
        {
            if ( args == null )
                _source.TraceData( eventType, 1, message );
            else
                _source.TraceData( eventType, 1, String.Format( CultureInfo.InvariantCulture, message, args ) );
        }

        /// <summary>
        /// Escribe una entrada de trace
        /// </summary>
        /// <param name="eventType">Tipo de evento</param>
        /// <param name="ex">Excepcion</param>
        /// <param name="message">mensaje</param>
        /// <param name="args">Argumentos del evento</param>
        private static void WriteTrace( TraceEventType eventType, Exception ex, string message, params object[] args )
        {
            if ( args == null )
                _source.TraceData( eventType, 1, String.Format( CultureInfo.InvariantCulture, "{0}{1}{2}", message, Environment.NewLine, ex ) );
            else
                _source.TraceData( eventType, 1, String.Format( CultureInfo.InvariantCulture, "{0}{1}{2}", String.Format( CultureInfo.InvariantCulture, message, args ), Environment.NewLine, ex ) );
        }

        #endregion
    }
}